如果不使用 ES6 的 Class,則可以考慮用 create-react-class 。
var HelloCreateClass = createReactClass({
render: function() {
return <h1>Hello, {this.props.greeting}</h1>;
}
});
以下改寫 Class Component <Clock>
的例子:
var Clock = createReactClass({
getInitialState: function() { //設定 State
return {
date: new Date(),
timerID: ''
};
},
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
},
componentWillUnmount() {
clearInterval(this.timerID);
},
tick() {
this.setState({
date: new Date()
});
},
start() { //不需要寫 this.start = this.start.bind(this) 就自動綁定
this.timerID = setInterval(
() => this.tick(),
1000
);
},
stop() {
clearInterval(this.timerID);
},
render: function() {
return <div>
<h1>Hello, Create Class!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
<button onClick={this.start}> Start</button><button onClick={this.stop}> Stop</button>
</div>;
}
});
ES6 並沒有支援任何 mixin 語法。因此當你在 React 中使用 ES6 class 時也不支援使用 mixin。
我們也發現在程式中使用 mixin 會造成很多問題,因此不建議在新的程式碼中使用 mixin。
此段落內容僅供參考。 - React Document
下面將 setinterval 相關功能拆出 Mixin 的功能作為例子:
var SetIntervalMixin = {
getInitialState: function() { //設定 State
return {
date: new Date(),
timerID: ''
};
},
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
},
componentWillUnmount() {
clearInterval(this.timerID);
},
tick() {
this.setState({
date: new Date()
});
},
};
var Clock = createReactClass({
mixins: [SetIntervalMixin], // 使用 mixin
//略
});
以上今天。
參考資料:
https://zh-hant.reactjs.org/docs/react-without-es6.html
https://zh-hant.reactjs.org/blog/2016/07/13/mixins-considered-harmful.html